package org.example.ba03;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import java.util.Date;

/*@Aspect :  该注解是aspect中的注解，表示该类是切面类
*           切面类：用来给目标方法增加功能的类，在该类中有切面代码*/
@Aspect
public class MyAspect {
/*
    环绕通知方法定于格式：
    1.public
    2.必须有一个返回值，推荐使用Object
    3.方法名称自定义
    4.方法有参数，固定的参数
* */
/*
*   @Around :环绕通知
*   他是功能最强的通知
*   1.在目标方法的前和后都能增强功能
*   2.控制目标方法是否被调用执行
*   3.修改目标方法的执行结果，影响最后的调用结果
*
* 环绕通知，等同于jdk代理的  InvocationHandler  接口
* ProceedingJoinPoint  的作用 等同于   jdk动态代理参数Method   用来执行目标方法
*
* 环绕通知经常用于事务，在目标方法之前开启事务，执行目标方法 在目标方法之后提交事务*/
    @Around(value= "execution(* *..SomeServiceImpl.doFirst(..))" )
    public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
        Object o;
        System.out.println(new Date());
        Object objects[] = pjp.getArgs();
        for(Object o1:objects){
            System.out.println(o1);
        }

        o = pjp.proceed(); //method.invoke();
        //System.out.println(o);
        o = "修改之后的返回值";
        System.out.println("事务提交");
        return o;
    }
}
